package main

import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"os"
)

func main() {
	//1、写文件然后开始读取文件内容
	//writeFile1("./1.txt", "这是1")
	//con, err := readFile1("./1.txt")
	//if err != nil {
	//	log.Println(err)
	//} else {
	//	log.Println(con)
	//}
	//2、写文件然后开始读取文件内容
	//writeFile2("./2.txt", "这是2")
	path := "./fileLearn/fileDir/2.txt"
	con, err := readFile2(path)
	if err != nil {
		log.Println(err)
	} else {
		log.Println("--->" + con)
	}
	//3、写文件然后开始读取文件内容
	//writeFile3("./3.txt", "这是3")
	//con, err := readFile3("./3.txt")
	//if err != nil {
	//	log.Println(err)
	//} else {
	//	log.Println(con)
	//}
}

/**
1、读取方式
*/
func readFile1(fileName string) (con string, err error) {
	//打开文件
	file, e := os.Open(fileName)
	if e != nil {
		log.Println("open file err=", e)
		return "", e
	}
	defer file.Close()
	data := make([]byte, 1<<10*100)
	n, err := file.Read(data)
	return string(data[:n]), nil
}

/**
2、读取方式
*/
func readFile2(fileName string) (con string, err error) {
	//打开文件
	file, e := os.Open(fileName)
	if e != nil {
		log.Println("open file err=", e)
		return "", e
	}
	defer file.Close()
	/**
	1、reader 默认每次读取的文件大小为4K byte，
	2、当超过4K 需要再次读取该文件，此处应该采用循环读取的方式
	*/
	reader := bufio.NewReader(file)
	count := 0
	str := ""
	for {
		//4K
		//data := make([]byte, 1<<10*6)
		//1、直接使用reader 的read 读取
		//n, err := reader.Read(data)
		//if err == io.EOF {
		//	log.Println("文件读取完了")
		//	break
		//} else {
		//	count++
		//	log.Printf("第%d 读取,字节数位=%d", count, n)
		//}
		//str = fmt.Sprintf("%s%s", str, string(data[:n]))
		//2、此处采用的是 按照 每行读取的方式 进行读取，还可以使用reader.readline()效率低
		bytes, err := reader.ReadBytes('\n')
		//log.Println(bytes)
		str = fmt.Sprintf("%s%s", str, string(bytes))
		count++
		log.Printf("第%d 读取,字节数位=%d", count, len(bytes))
		if err == io.EOF {
			log.Println("文件读取完了")
			break
		}
	}

	return str, nil
}

/**
3、读文件方式
*/
func readFile3(fileName string) (con string, err error) {
	//根据文件大小将文件内容进行了全部的读取
	bytes, err := ioutil.ReadFile(fileName)
	return string(bytes), nil
}

/**
1、写文件方式
*/
func writeFile1(fileName string, data string) {
	//创建文件
	file, e := os.Create(fileName)
	if e != nil {
		log.Println("create file err=", e)
		return
	}
	defer file.Close()
	//写文件
	n, e := file.Write([]byte(data))
	if e == nil && n > 0 {
		log.Println("writer file success")
	}
}

/**
2、写文件方式
*/
func writeFile2(fileName string, data string) {
	//创建文件
	file, e := os.Create(fileName)
	if e != nil {
		log.Println("create file err=", e)
		return
	}
	defer file.Close()
	//写文件
	writer := bufio.NewWriter(file)
	//缓存清空
	defer writer.Flush()
	nn, e := writer.Write([]byte(data))
	if e == nil && nn > 0 {
		log.Println("writer file success")
	}
}

/**
3、写文件
*/
func writeFile3(fileName string, data string) {
	e := ioutil.WriteFile(fileName, []byte(data), 0777)
	if e == nil {
		log.Println("writer file success")
	}
}
